Release CodeTruss CLI v0.2.52 - #45
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Syncs the 0.2.52 source from the private monorepo, byte for byte against the monorepo git objects (169 paths compared by blob hash, 0 mismatches, 0 missing).
That digest was not copied into
release-reference.json:pnpm release:artifactwas run against this tree, resolved from this repository's own lockfile, and the rebuilt archivecmps clean against the monorepo's copy, against the monorepo'slatestpointer, and against the bytes codetruss.com is serving right now. The samecmpagainst 0.2.51 exits 1, so the comparison is capable of failing.The blob-hash comparison was run a second time against the pre-sync tree as a negative control: it reported 9 mismatched paths and 3 missing, and exited 1, so a sync that silently dropped a file would not have passed.
Why this one is urgent
https://codetruss.com/downloads/codetruss-cli-latest.jsonalready advertises 0.2.52, and itsreleaseUrl—.../releases/tag/v0.2.52— currently 404s, because the release does not exist yet. Tagging this merge is what makes the advertised URL resolve.The lead correction is also a safety claim, sitting in the README inside the published tarball, that overstates what the tool protects. That is the worst direction to be wrong in, so it does not wait for a feature release.
What 0.2.52 is
Three corrections to published artifacts. No behaviour changes — the compiled bundle is unchanged apart from the version string it prints (see below).
--yesnever required--allow, and the shipped README said it did. The sentence read: "Non-interactive--yessetup requires explicit--allowvalues."resolveAllowGlobsinpackages/cli/src/setup.tsdoes close to the opposite: given no explicit value it adopts every conventional source directory that exists at the repository root —src,app,apps,packages,lib,components,server,client,public,test,tests,e2e,spec,docs— as<dir>/**, prints what it adopted, and continues. It refuses only when none of the fourteen exist.That sentence invited a reader to believe an unattended run could not adopt a scope they had not chosen, and it can. The behaviour itself is deliberate and stays: an unattended run on an ordinary repository should end up protected rather than halted over glob syntax, the adopted list is printed so the decision stays auditable, no repository-wide glob is ever adopted, and the genuinely dangerous decision — trusting repository verification commands — is still withheld without
--trust-verify. What was false was the documentation, so the documentation is what changed. The corrected text also names the two ways a detected scope goes wrong: it can be wider than intended, and it is blind to a source directory outside that list — onsindresorhus/ky, whose sources live insource/,--yesadoptstest/**alone and leaves the entire source tree out of scope, so ordinary changes read as scope drift.A correction to the 0.2.51 entry. That entry said the pre-commit block left "uninstalling as the only escape". The block itself reproduces;
git commit --no-verifyalso escapes it, and did on 0.2.50. 0.2.51's published text is deliberately not edited — it is tagged, attested and served, so it stands as shipped and the 0.2.52 entry carries the correction. The 0.2.51 section ofpackages/cli/CHANGELOG.mdis byte-identical between the two commits (4303 bytes), and the changelog diff in this PR is69 additions, 0 deletions.The scoring model has a reviewable diff again.
packages/analyzer-engine/src/scoring.tscarried two raw NUL bytes as map-key separators inside template literals, so git classified the file as binary and 0.2.47's rewrite ofdeduct()rendered asBin 5166 -> 8676 bytes, 0 additions, 0 deletions. Both separators are now written as the six-character escape; the runtime strings are identical. This commit's own diff for that file is still binary — git calls a diff binary when either side is, and the old side is — so the fix was checked directly instead: appending one line to the 0.2.52 blob and the 0.2.51 blob and diffing each against its original gives1 0for 0.2.52 and- -for 0.2.51. Every tracked source file in the monorepo now holds zero raw NUL bytes; the same scan at the 0.2.51 commit finds three, so the scan is capable of failing.The bundle is unchanged
dist/cli.cjsfrom the 0.2.52 archive and from the published 0.2.51 archive are the same length (819902 bytes) and differ at exactly one byte offset, 670204 — the1inversion:"0.2.51"becoming the2inversion:"0.2.52". One differing line out of 297. Nothing in the three corrections reaches the compiled output, which is what "no behaviour changes" is supposed to mean.Not touched
pnpm-workspace.yaml,.npmrc,pnpm-lock.yaml,package.json(root) and.github/are unchanged — the sync never writes mirror-owned files.public/downloads/grammars/is carried verbatim. No previously published artifact is modified:git statusunderpublic/downloads/reports nothing outsidecodetruss-cli-0.2.52.*and thelatestpointers, so 0.2.44 through 0.2.51 still have exactly the bytes they were attested with.CHANGELOG.mdat the root is regenerated frompackages/cli/CHANGELOG.mdby the same rule as before. The generator was checked by feeding it the 0.2.51 package changelog and confirming it reproduces the committed 0.2.51 root changelog byte-for-byte; run with a deliberately wrong release version it does not, so it is capable of failing. Its npm-trail sentence stays at 0.2.50, becausenpm view @codetruss/cli dist-tagsstill reportslatestas 0.2.50.Checked locally before opening
pnpm install --frozen-lockfileresolves with the lockfile untouched (the only source change topackages/cli/package.jsonis the version string).pnpm validatepasses against this branch: typecheck,release:artifact,pnpm test(35 files, 433 tests), the deterministic-package, release-verifier and changelog-policy suites,release:verify, andtest:install. The rebuilt archive reproduced5afc2a56…exactly, andrelease-reference.json's three digests were each measured off the files rather than transcribed.The release workflow's
awkextraction of the changelog entry was dry-run against the regeneratedCHANGELOG.mdand returns 59 non-empty lines, so the release note will not be install-steps-only; the sameawkfor a version with no entry returns 0 bytes, which is the case the workflow refuses to publish.🤖 Generated with Claude Code